package org.upm;

/**
* Hebra que atiende las peticiones realizadas por el SipServlet
* @author Jonathan Gonzalez
* @version 30/10/2008
*/

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.logging.Logger;
import java.util.StringTokenizer;

public class DroolsThread extends Thread{
	
    //Logger de la clase.
    private static Logger logger =
           Logger.getLogger(DroolsThread.class.getName());

	
	//Datos a devolver al SipServlet
	private byte[] data = null;
	
    //Datagram socket de la conexion
    private DatagramSocket dsocket;
    
    //Solicitud recibida del cliente
    private DatagramPacket solicitud;
    
    //Clasificador de Anuncios
    private ClasificadorAnuncios ca;
    
    //Usuarios registrados en el sistema.
    private Poblacion p; 
    
    //Anuncios registrados en el sistema.
    Object[] anuncios;
    
    /**
     * Contructor de la clase 
     * 
     * @param dsocket - socket de la conexión
     * @param solicitud - solicitud recibida del cliente
     * @param ca - Clasificador de Anuncios
     * @param p - Usuarios registrados en el sistema
     * @param anuncios - Anuncios registrados en el sistema.
     */
    public DroolsThread(DatagramSocket dsocket, DatagramPacket solicitud, 
    		ClasificadorAnuncios ca, Poblacion p, Object[] anuncios){
    	this.solicitud = solicitud;
    	this.dsocket = dsocket;
    	this.ca = ca;
    	this.p = p;
    	this.anuncios = anuncios;
    }
    
    /**
     * Ejecucion del cuerpo de la hebra
     */
      @Override
      public void run(){
          try {
        	  
        	  //Extraemos la solicitud
        	  data = solicitud.getData();
        	  String peticion = new String(data);
        	  
        	  //Extraemos el nombre del usuario que realiza la llamada
        	  StringTokenizer st = new StringTokenizer(peticion,".");
        	  String llamante = st.nextToken();
        	  logger.info(llamante);
        	  
        	  //Extraemos el nombre del usuario al que va dirigida la llamada.
        	  String destinatario = st.nextToken();
        	  logger.info(destinatario);
        	  
        	  //Seleccionamos los usuarios del sistema
        	  Usuario origen = p.dameUsuario(llamante);
        	  Usuario destino = p.dameUsuario(destinatario);
        	  origen.setDestinatario(destino);
        	  logger.info(llamante + " realiza una llamada a " + destinatario);
        	  
        	  
        	  //Debuggeando
        	  String nombre = origen.getNombre();
        	  String aficion = origen.getAficion();
        	  logger.info("Realiza la llamada " + nombre + " con hobbies " + aficion);
        	  nombre = origen.getDestinatario().getNombre();
        	  aficion = origen.getDestinatario().getAficion();
        	  logger.info("Recibe la llamada " + nombre + " con hobbies " + aficion);
        	  
        	  //Seleccionamos el anuncio más adecuado para el llamante.
  			  Anuncio personalizado = ca.seleccionaAnuncio( origen, anuncios);
  			  
  			  //Generamos la respuesta al cliente
  			  String anuncio = personalizado.getNombre() + ".";
  			  byte[] respuesta = anuncio.getBytes();
  			  DatagramPacket dp = new DatagramPacket(respuesta, respuesta.length,
  					  solicitud.getAddress(), solicitud.getPort());
  			  dsocket.send(dp);
          }
          catch (Exception ex) {
          logger.severe(ex.toString());
      }

     }
}


